package net.mimai.vultrue.bus.excel.reader;

import net.mimai.vultrue.bus.excel.reader.parser.ExcelDomParser;
import net.mimai.vultrue.bus.excel.reader.rule.DefaultParserRule;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;

/**
 * @ClassName ExcelGenerator
 * @Description TODO
 * @Author 方丈
 * @Date 2021/4/16 14:39
 * @Version 1.0.0
 **/
@Component
public class ExcelReaderEngine {
    Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 解析Excel到实体对象列表
     * @param filePath Excel文件路径
     * @param columnSize 列数量
     * @param T 实体对象类型
     * @param header 标题头
     * @return  实体对象列表
     */
    public List<T> execute(String filePath,int columnSize,Class T,List<String> header) {
        return execute(filePath,columnSize,0,T,header);
    }

    /**
     * 解析Excel到实体对象列表
     * @param filePath Excel文件路径
     * @param columnSize 列数量
     * @param sheetNum 待解析的sheet序号，从0开始
     * @param T  实体对象类型
     * @param header 标题头
     * @return  实体对象列表
     */
    public List<T> execute(String filePath,int columnSize,Integer sheetNum,Class T,List<String> header) {
        try(InputStream resourceAsStream = new FileInputStream(filePath)){
            return execute(resourceAsStream,columnSize,sheetNum,T,header);
        } catch (IOException e) {
            logger.error("解析excel失败",e);
        }
        return Collections.emptyList();
    }

    /**
     * 解析Excel到实体对象列表
     * @param inputStream Excel文件流
     * @param columnSize 列数量
     * @param T 实体对象类型
     * @param header 标题头
     * @return  实体对象列表
     */
    public List<T> execute(InputStream inputStream, int columnSize, Class T, List<String> header) {
        return execute(inputStream,columnSize,0,T,header);
    }

    /**
     * 解析Excel到实体对象列表
     * @param inputStream Excel文件流
     * @param columnSize 列数量
     * @param sheetNum  待解析的sheet序号，从0开始
     * @param T 实体对象类型
     * @param header 标题头
     * @return 实体对象列表
     */
    public List<T> execute(InputStream inputStream,int columnSize,Integer sheetNum,Class T,List<String> header) {
        IExcelParser<T> parser = new ExcelDomParser<>();
        IParseRule parserParam = DefaultParserRule.builder()
                .excelInputStream(inputStream)
                .columnSize(columnSize)
                .sheetNum(sheetNum)
                .targetClass(T)
                .header(header)
                .build();
        return parser.parse(parserParam);
    }
}
